/* 
  注意：
  1. 有时候url的输入可能是空的
  2. url中的部分字符串可能经过了一定的转换编码了，需要转换回来
  3. 对于一些重复出现的键的情况，一般是将其放在一个数组中，而不是让后面的值覆盖前面的值
*/
// 简单版本，没有考虑到上面的情况的写法
function getUrlParams(url = "") {
  let resultParmas = {};
  let parmasStringArray = url.split("?")[1].split("&");
  for (let i = 0; i < parmasStringArray.length; i++) {
    const [key, value] = parmasStringArray[i].split("=");
    resultParmas[key] = value;
  }
  return resultParmas;
}

// 相对比较完善的版本
function getUrlParams(url = "") {
  const resultParams = {};

  // 确保 url 至少有一个问号，表示有查询字符串
  if (!url.includes("?")) return resultParams;

  // 提取并分割查询字符串部分
  const paramString = url.split("?")[1];
  // 判断是否已经截取到了字符串
  const paramPairs = paramString ? paramString.split("&") : [];

  for (const pair of paramPairs) {
    if (!pair) continue; // 跳过空字符串

    // 分割键值对，并解码它们
    // 使用map将键和值都解码的原因是，有时候键也会被编码
    const [key, value] = pair
      .split("=")
      .map((part) => decodeURIComponent(part || ""));

    // 如果 key 已经存在于结果对象中，则考虑将其转换为数组
    if (resultParams.hasOwnProperty(key)) {
      // 如果已经是数组，则直接 push 新值
      if (Array.isArray(resultParams[key])) {
        resultParams[key].push(value);
      } else {
        // 否则创建一个新数组
        resultParams[key] = [resultParams[key], value];
      }
    } else {
      resultParams[key] = value;
    }
  }

  return resultParams;
}

// 使用示例
const url =
  "http://example.com/?name=John%20Doe&age=30&hobbies=reading&hobbies=swimming";
console.log(getUrlParams(url));
